#include "tab.h"

Tab::Tab(Tabwidget* t, Legami* l, QSqlDatabase* db): tabbed(t), gestore(l), db(db) {}

Tab::~Tab(){
    delete mainLayout;
    delete layout;
    delete accedi;
    delete registro;
    delete groups;
    delete contacts;
    delete canc;
    delete delacc;
    delete upgrade;
    delete searchacc;
    delete searchgru;
    delete back;
    delete infoacc;
    delete search;
    delete label1;
    delete label2;
    delete label3;
    delete label4;
    delete label5;
    delete label6;
    delete src1;
    delete src2;
    delete src3;
    delete alert;
    delete step;
    delete info;
    delete le1;
    delete le2;
    delete le3;
    delete le4;
    delete le5;
    delete le6;
    delete le7;
    delete le8;
    delete le9;
    delete le10;
    delete cb;
    delete cbacc;
    delete gg;
    delete mm;
    delete aa;
    delete in;
    delete cbno;
    delete cbam;
    delete cbco;
    delete cbpa;
    delete cbpn;
    delete cbcds;
    delete cbmdg;
    delete bgtag;
    delete logo;
    delete icona;
    delete bd;
    delete sc;
    delete sc2;
    delete i;
    delete faceb;
    delete twitt;
    //QMap<QPushButton*, Account*> profac
        profac.clear();
    //QMap<QPushButton*, Gruppo*> g
        g.clear();
    //QVector<QLabel*> temp_labels
        for(int i=0;i!=temp_labels.size();i++){
            delete temp_labels[i];
        }
}

void Tab::init_tab()
{
    setAutoFillBackground(true);

    QPalette pal = this->palette();
    pal.setColor(QPalette::Window, Qt::white); //QPalette::Window indica che voglio cambiare il colore di sfondo
    this->setPalette(pal);

    //creazione dei widget (almeno inizialmente) in comune tra TabUser e TabAmm
    label1= new QLabel("Username");
    le1= new QLineEdit();
    label2= new QLabel("Password");
    le2= new QLineEdit();
    le2->setEchoMode(QLineEdit::Password);
    accedi= new QPushButton("Accedi");
    registro= new QPushButton("Sei nuovo? Registrati");
    delacc= new QPushButton("Cancella Account");
    upgrade= new QPushButton();
    searchacc= new QPushButton("Ricerca Utenti");
    searchgru= new QPushButton("Ricerca Gruppi");
    searchacc->setIcon(QIcon("icons/src.png"));
    searchgru->setIcon(QIcon("icons/src.png"));
    delacc->setIcon(QIcon("icons/delacc.gif"));
    alert= new QLabel("Utente non esistente. \nRiprovare o registrare nuovo utente");
    QPalette palette;
    palette.setColor(QPalette::WindowText, Qt::red);
    alert->setPalette(palette);
    groups= new QPushButton("Gruppi");
    contacts= new QPushButton("Contatti");
    canc= new QPushButton();
    step= new QLabel("");
    QPalette palettes;
    palettes.setColor(QPalette::WindowText, Qt::blue);
    step->setPalette(palettes);
    info= new QLabel("");
    label3= new QLabel("Username");
    le3= new QLineEdit();
    label4= new QLabel("Password");
    label5= new QLabel("Sesso");
    le4= new QLineEdit();
    le4->setEchoMode(QLineEdit::Password);
    cb= new QComboBox();
    label6= new QLabel("Tipo di Account");
    src1= new QLabel("");
    src2= new QLabel("");
    src3= new QLabel("");
    cbacc= new QComboBox();
    cb->addItem("Femmina");
    cb->addItem("Maschio");
    cbacc->addItem("Account normale");
    cbacc->addItem("Business Account");
    cbacc->addItem("Executive Account");
    gg= new QComboBox();
    for(int id=1; id<=31; id++){
        QString day;
        day.setNum(id);
        gg->addItem(day);
    }
    mm= new QComboBox();
    mm->addItem("Gennaio");
    mm->addItem("Febbraio");
    mm->addItem("Marzo");
    mm->addItem("Aprile");
    mm->addItem("Maggio");
    mm->addItem("Giugno");
    mm->addItem("Luglio");
    mm->addItem("Agosto");
    mm->addItem("Settembre");
    mm->addItem("Ottobre");
    mm->addItem("Novembre");
    mm->addItem("Dicembre");
    aa= new QComboBox();
    for(int iy=1993; iy>1920; iy--){
        QString year;
        year.setNum(iy);
        aa->addItem(year);
    }
    in= new QSpinBox();
    in->setRange(1,6);
    in->setValue(1);
    le5= new QLineEdit();
    le6= new QLineEdit();
    le7= new QLineEdit();
    le8= new QLineEdit();
    le9= new QLineEdit();
    le10= new QLineEdit();
    back= new QToolButton();
    back->setIcon(QIcon("icons/back.png"));
    back->setIconSize(QSize(30,30));
    search= new QToolButton();
    search->setIcon(QIcon("icons/src.png"));
    back->setIconSize(QSize(30,30));
    infoacc= new QToolButton();
    infoacc->setIcon(QIcon("icons/qmark.png"));
    bd= new Logo("icons/bd.png",this);
    sc= new Logo("icons/school.png",this);
    sc2= new Logo("icons/school.png",this);
    i= new Logo("icons/interessi.png");
    faceb= new Logo("icons/icona_facebook.png",this);
    twitt= new Logo("icons/icona_twitter.png",this);
    icona= new Logo("",this);
    bgtag= new QButtonGroup();
    cbno= new QCheckBox("Nessun tag");
    cbam= new QCheckBox("Amico");
    cbco= new QCheckBox("Collega");
    cbpa= new QCheckBox("Parente");
    cbpn= new QCheckBox("Partner");
    cbcds= new QCheckBox("Compagno di studi");
    cbmdg= new QCheckBox("Membro di gruppo");
    bgtag->addButton(cbno,0);
    bgtag->addButton(cbam,1);
    bgtag->addButton(cbco,2);
    bgtag->addButton(cbpa,3);
    bgtag->addButton(cbpn,4);
    bgtag->addButton(cbcds,5);
    bgtag->addButton(cbmdg,6);

    disconnect(accedi,0,0,0);
    connect(accedi, SIGNAL(clicked()), this, SLOT(login()));
    //creazione layout
    horizontal_bar_logo();
    horizontal_bar_choice();
    mainLayout = new QVBoxLayout;
    mainLayout->addWidget(hgl, 30, Qt::AlignCenter);
    mainLayout->addWidget(hgc, 3000);
    setLayout(mainLayout);
}

void Tab::horizontal_bar_logo()
{
    hgl = new QGroupBox();

    QGridLayout* layout = new QGridLayout;

    logo=new Logo("img/lbw.jpg", this);
    logo->setFixedSize(300,180);

    layout->addWidget(logo, 0, 2, Qt::AlignCenter);

    hgl->setLayout(layout);
}

void Tab::hideAll(){
    accedi->hide();
    registro->hide();
    upgrade->hide();
    groups->hide();
    contacts->hide();
    back->hide();
    search->hide();
    infoacc->hide();
    canc->hide();
    searchacc->hide();
    searchgru->hide();
    delacc->hide();
    label1->hide();
    label2->hide();
    label3->hide();
    label4->hide();
    label5->hide();
    label6->hide();
    src1->hide();
    src2->hide();
    src3->hide();
    step->hide();
    info->hide();
    le1->hide();
    le2->hide();
    le3->hide();
    le4->hide();
    le5->hide();
    le6->hide();
    le7->hide();
    le8->hide();
    le9->hide();
    le10->hide();
    alert->hide();
    cb->hide();
    gg->hide();
    mm->hide();
    aa->hide();
    cbacc->hide();
    in->hide();
    bd->hide();
    sc->hide();
    sc2->hide();
    i->hide();
    faceb->hide();
    twitt->hide();
    if(!(bgtag->buttons().count()==0))
        for(int i=0; i<bgtag->buttons().count(); i++)
            bgtag->button(i)->hide();
    if(!(temp_labels.isEmpty()))
        for(QVector<QLabel*>::iterator it= temp_labels.begin(); it!= temp_labels.end(); it++)
            (*it)->hide();
    if(!(g.isEmpty()))
        for(QMap<QPushButton*, Gruppo*>::const_iterator i = g.constBegin(); i!= g.constEnd(); i++)
            i.key()->hide();
    if(!(profac.isEmpty()))
        for(QMap<QPushButton*, Account*>::const_iterator i = profac.constBegin(); i!= profac.constEnd(); i++)
            i.key()->hide();
}

void Tab::clear_le() const{
    le1->clear();
    le2->clear();
    le2->setEchoMode(QLineEdit::Normal);
    le3->clear();
    le4->clear();
}

void Tab::acc(){
    QFont fontdown= label4->font();
    hideAll();
    new_user->hide();
    label1->setText("Differenze tra le tipologie di Account\n");
    label1->show();
    QFont font= label1->font();
    font.setPointSize(15);
    label1->setFont(font);
    accedi->setIcon(QIcon(""));
    registro->setIcon(QIcon(""));
    canc->setIcon(QIcon(""));
    accedi->setText("Account normale");
    registro->setText("Business Account");
    canc->setText("Executive Account");
    accedi->setEnabled(false);
    registro->setEnabled(false);
    canc->setEnabled(false);
    accedi->show();
    registro->show();
    canc->show();
    label2->setFont(fontdown);
    label2->setText("- Solo iscrizioni a gruppi\n-Massimo 5 contatti\n-Ricerca di utenti:massimo 10 risultati\n"
                    "-Ricerca di gruppi: massimo 20 risultati");
    label2->show();
    label3->setText("-Possibile anche creare gruppi\n-Massimo 30 contatti\n-Ricerca di utenti:massimo 60 risultati\n"
                    "-Ricerca di gruppi: massimo 100 risultati");
    label3->show();
    label4->setText("-Possibile anche eliminare gruppi\n-Numero illimitato di contatti\n-Ricerca di utenti: nessun limite sui risultati\n"
                    "-Ricerca di gruppi: nessun limite sui risultati");
    label4->show();
    layout->addWidget(label1, 2, 2, Qt::AlignCenter);
    layout->addWidget(accedi, 3,1);
    layout->addWidget(label2, 4,1);
    layout->addWidget(registro, 3,2);
    layout->addWidget(label3,4,2);
    layout->addWidget(canc, 3,3);
    layout->addWidget(label4,4,3);
}

void Tab::dim_row(int row, int numrows){
    for(int i=1; i<=row; i++)
        layout->setRowStretch(i,5);
    for(int i= row+1; i<numrows; i++)
        layout->setRowStretch(i,0);
    layout->setRowStretch(numrows,5);
}

void Tab::pbicon(QPushButton* pb, int s){
    switch(s){
    case 0:
        pb->setIcon(QIcon("icons/female.png"));
        break;
    case 1:
        pb->setIcon(QIcon("icons/male.png"));
        break;
    }
}

bool Tab::check_free(QString string) const{
    QRegExp rx("([A-Z]{1}[a-z]+\\s?)+");  //Lettera maiuscola, lettere minuscole, spazio(se si vuole), quante volte si vuole
    QRegExpValidator v(rx,0);
    int pos=0;
    if ((v.validate(string,pos))==2) return true; //controllo che la stringa possa andare, 2 indica che e' completamente ok, non in parte!
    else return false;
}

bool Tab::check_url(QString string, int state) const{
    if(!state){   //controllo facebook
        QRegExp rx(".*(facebook.)(com|it|us|fr|es|org)(.+)*", Qt::CaseInsensitive, QRegExp::RegExp);
        QRegExpValidator v(rx,0);
        int pos=0;
        if ((v.validate(string,pos))==2) return true; //controllo che la stringa possa andare, 2 indica che e' completamente ok, non in parte!
        else return false;
    }
    else{       //controllo twitter
        QRegExp rx(".*(twitter.com/#!/)(.+)*", Qt::CaseInsensitive, QRegExp::RegExp);
        QRegExpValidator v(rx,0);
        int pos=0;
        if ((v.validate(string,pos))==2) return true; //controllo che la stringa possa andare, 2 indica che e' completamente ok, non in parte!
        else return false;
    }
}

bool Tab::check_interest(){
    int i= in->text().toInt();
    temp_in.clear();

    switch(i){
    case 1:
        if(le5->text().isEmpty()) return 0;
        else{
            temp_in.push_back(le5->text());
            return 1;
        }
        break;
    case 2:
        if(le5->text().isEmpty() || le6->text().isEmpty()) return 0;
        else{
            temp_in.push_back(le5->text()); temp_in.push_back(le6->text());
            return 1;
        }
        break;
    case 3:
        if(le5->text().isEmpty() || le6->text().isEmpty() || le7->text().isEmpty()) return 0;
        else{
            temp_in.push_back(le5->text()); temp_in.push_back(le6->text()); temp_in.push_back(le7->text());
            return 1;
        }
        break;
    case 4:
        if(le5->text().isEmpty() || le6->text().isEmpty() || le7->text().isEmpty() || le8->text().isEmpty()) return 0;
        else{
            temp_in.push_back(le5->text()); temp_in.push_back(le6->text()); temp_in.push_back(le7->text());
            temp_in.push_back(le8->text());
            return 1;
        }
        break;
    case 5:
        if(le5->text().isEmpty() || le6->text().isEmpty() || le7->text().isEmpty() || le8->text().isEmpty() || le9->text().isEmpty())
            return 0;
        else{
            temp_in.push_back(le5->text()); temp_in.push_back(le6->text()); temp_in.push_back(le7->text());
            temp_in.push_back(le8->text()); temp_in.push_back(le9->text());
            return 1;
        }
        break;
    case 6:
        if(le5->text().isEmpty() || le6->text().isEmpty() || le7->text().isEmpty() || le8->text().isEmpty() || le9->text().isEmpty() || le10->text().isEmpty())
            return 0;
        else{
            temp_in.push_back(le5->text()); temp_in.push_back(le6->text()); temp_in.push_back(le7->text());
            temp_in.push_back(le8->text()); temp_in.push_back(le9->text()); temp_in.push_back(le10->text());
            return 1;
        }
        break;
    }
}

void Tab::showprofile(User* prof_u){
    hideAll();
    label1->setText(prof_u->getNome().append(" ").append(prof_u->getCognome()));
    int sex= prof_u->getGender();
    switch(sex){
    case 0:
        delete icona;
        icona =new Logo("icons/female.png", this);
        break;
    case 1:
        delete icona;
        icona =new Logo("icons/male.png", this);
        break;
    }
    QFont font= label1->font();
    font.setPointSize(28);
    label1->setFont(font);
    label2->setText("Informazioni");
    font= label2->font();
    font.setBold(true);
    font.setUnderline(true);
    font.setPointSize(17);
    label2->setFont(font);
    label3->setText(prof_u->getProfilo()->visualizzaProfilo()->getBd());
    font= label3->font();
    font.setPointSize(13);
    font.setItalic(true);
    label3->setFont(font);
    label4->setText(prof_u->getProfilo()->visualizzaProfilo()->getS1());
    label4->setFont(font);
    label5->setText(prof_u->getProfilo()->visualizzaProfilo()->getS2());
    label5->setFont(font);
    back->show();
    bd->show();
    sc->show();
    sc2->show();
    i->show();
    label1->show();
    label2->show();
    label3->show();
    label4->show();
    label5->show();

    layout->addWidget(icona,0,0,3,2);
    layout->addWidget(label1,0,1, Qt::AlignRight);
    layout->addWidget(label2, 2,0);
    layout->addWidget(bd, 3,0);
    layout->addWidget(label3, 3,1);
    layout->addWidget(sc, 4,0);
    layout->addWidget(label4, 4,1);
    layout->addWidget(sc2, 5,0);
    layout->addWidget(label5, 5,1);

    QString face= prof_u->getProfilo()->visualizzaProfilo()->getLink1();
    QString twit= prof_u->getProfilo()->visualizzaProfilo()->getLink2();
    label6->setText(face);
    info->setText(twit);
    label6->setFont(font);
    info->setFont(font);
    if(!(face.isEmpty())&&!(twit.isEmpty())){   //presenti sia link facebook che twitter
        label6->show();
        info->show();
        layout->addWidget(faceb,6,0);
        layout->addWidget(label6,6,1, Qt::AlignTop);
        layout->addWidget(twitt,7,0);
        layout->addWidget(info,7,1, Qt::AlignTop);
        faceb->show();
        twitt->show();
    }
    else if(face.isEmpty()){
        if(!twit.isEmpty()){    //solo link twitter
            label6->setText(twit);
            label6->show();
            layout->addWidget(twitt,6,0);
            layout->addWidget(label6,6,1,Qt::AlignTop);
            twitt->show();
        }
    }
    else if(twit.isEmpty()){
        if(!face.isEmpty()){    //solo link facebook
            label6->setText(face);
            label6->show();
            layout->addWidget(faceb, 6,0);
            layout->addWidget(label6, 6,1, Qt::AlignTop);
            faceb->show();
        }
    }

    QVector<QString> is= prof_u->getProfilo()->visualizzaProfilo()->getI(); //interessi

    int row= 8;
    layout->addWidget(i, row, 0);
    for(QVector<QString>::iterator it= is.begin(); it!= is.end(); it++, row++){
        QLabel* temp_label= new QLabel((*it));
        temp_label->show();
        temp_label->setFont(font);
        temp_labels.push_back(temp_label);
        layout->addWidget(temp_label,row,1);
    }

    int numrow= layout->rowCount();
    dim_row(row,numrow);
}

void Tab::showG(Gruppo* gr){
    hideAll();

    label1->setText(gr->getNome());
    QFont font= label1->font();
    font.setPointSize(28);
    label1->setFont(font);
    label2->setText("Altri utenti nel gruppo");
    font.setBold(false);
    font.setItalic(true);
    font.setPointSize(18);
    label2->setFont(font);
    label1->show();
    label2->show();
    label4->show();

    font.setPointSize(13);
    font.setItalic(false);
    label4->setFont(font);

    layout->addWidget(label2, 2,1, Qt::AlignCenter | Qt::AlignBottom);
    layout->addWidget(label4, 0,4);
}

bool Tab::sortPA(int& row){ //qui la label3 non ha un settext unico come in sortG() presente sotto, perche' mentre quello sotto viene
                            //usato solo nelle ricerche di gruppi, questo viene usato anche per mostrare gli utenti di un gruppo
                            //e i contatti di un utente,che richiedono un "avviso" diverso.
    if(!(profac.isEmpty())){
            for(QMap<QPushButton*, Account*>::const_iterator i = profac.constBegin(); i!= profac.constEnd(); i++,row++){
                layout->addWidget(i.key(),row,1,Qt::AlignBottom);
            }
            return true;
        }
    else{
        label3->show();
        layout->addWidget(label3, row, 1, Qt::AlignCenter);
        return false;
    }
}

void Tab::sortG(int& row){
    if(!g.isEmpty()){    //riordino g
        for(QMap<QPushButton*, Gruppo*>::const_iterator i = g.constBegin(); i!= g.constEnd(); i++,row++)
            layout->addWidget(i.key(),row,1, Qt::AlignTop);
    }
    else{
        label3->setText("Nessun risultato corrispondente alla tua ricerca."
                        "\nVerifica l'ortografia o prova con un altro termine.");
        label3->show();
        layout->addWidget(label3, row,1, Qt::AlignTop);
    }
}

int Tab::tryAcc(User* acc){
    //(0:non c'e' account, 1 c'e' account ma non c'e' user, 2 no problem) e coun uno switch al ritorno faccio quel che devo fare!
    try {gestore->foundacc(current);}
    catch(logic_error){    //...se non esiste piu' il current
        QMessageBox::about(this,"ERRORE","Attenzione! Il profilo dell'account in uso non e' piu' disponibile."
                       "\nRiprovare in un secondo momento!");
        return 0;    //evitare seguenti
    }
    if(current!= acc){
        try{gestore->foundacc(acc);}
        //entra anche quando upgrado un  utente, perche' la sua zona di memoria cambia e quindi il puntatore non punta
        //piu' a quella precedente. E' come se cambiasse proprio utente!!
        catch(logic_error){
            QMessageBox::about(this,"ERRORE","Attenzione! Questo utente non e' piu' in Legami o e' cambiato il suo profilo."
                               "\nRiprovare in un secondo momento!");
            return 1;
        }
    }
    return 2;
}

void Tab::missingacc(){ //chiamato quando il TryAcc o il tryGru(di Tab, dato che quello di TabAmm non fa il controllo,tranne un caso)
                        //ritorna 0(= non c'e' piu' il profilo del current!): si da l'avviso, si chiude la
                        //scheda,e nel caso la scheda fosse stata l'unica aperta,si chiude la finestra users.
    tabbed->removeTab(tabbed->indexOf(this));
    if(tabbed->count()==0)
        tabbed->close();
}

int Tab::tryGru(Gruppo* gru){
    //(0:non c'e' account, 1 c'e' account ma non c'e' gruppo, 2 no problem) e coun uno switch al ritorno faccio quel che devo fare!
    try {gestore->foundacc(current);}
    catch(logic_error){    //...se non esiste piu' il current
        QMessageBox::about(this,"ERRORE","Attenzione! Il profilo dell'account in uso non e' piu' disponibile."
                       "\nRiprovare in un secondo momento!");
        return 0;    //evitare seguenti
    }
    try {gestore->foundgruppo(gru);} //controllo che il gruppo esista ancora
    catch(logic_error){    //...se non esiste piu'
        QMessageBox::about(this,"ERRORE","Attenzione! Questo gruppo non esiste piu'");
        return 1;    //evitare seguenti
    }
    return 2;
}

void Tab::removeatab(int p){
    tabbed->removeTab(p);
    if(tabbed->count()==1)      //se c'e' un solo tab, non permetto la chiusura da tab stesso
        tabbed->setTabsClosable(false);

    disconnect(tabbed, SIGNAL(tabCloseRequested(int)),0,0);
    connect(tabbed, SIGNAL(tabCloseRequested(int)), this, SLOT(removeatab(int)));
}

void Tab::userinsert(QString){
    if(le2->text().isEmpty())
        connect(le2, SIGNAL(textChanged(QString)), this, SLOT(pwdinsert(QString)));
    else
        accedi->setEnabled(true);

    connect(le1, SIGNAL(textChanged(QString)), this, SLOT(disab(QString)));
    connect(le2, SIGNAL(textChanged(QString)), this, SLOT(disab(QString)));
}

void Tab::pwdinsert(QString){
    if(le1->text().isEmpty())
        connect(le1, SIGNAL(textChanged(QString)), this, SLOT(userinsert(QString)));
    else
        accedi->setEnabled(true);

    connect(le1, SIGNAL(textChanged(QString)), this, SLOT(disab(QString)));
    connect(le2, SIGNAL(textChanged(QString)), this, SLOT(disab(QString)));
}

void Tab::disab(QString x){
    if (x.isEmpty()) accedi->setDisabled(true);
}

void Tab::quitGr(){
    switch(tryGru(grcurr)){
    case 0:
        missingacc();
        return;
    case 1:
        showgroups();
        return;
    case 2:
        current->eraseGruppo(grcurr);
        grcurr->deleteUser(current);
        //Su database
        QSqlQuery query(*db);
        db->transaction();
        query.prepare("Delete from gruppi where(username=:user and id_group=:id)");
        query.bindValue(":user", current->getNick());
        query.bindValue(":id", grcurr->getId());
        query.exec();
        db->commit();
        QString avviso("L'utente ");
        avviso.append(current->getNome()).append(" ").append(current->getCognome()).append(" e' uscito dal gruppo ");
        avviso.append(grcurr->getNome());
        QMessageBox::about(this,"Operazione riuscita",avviso);
        showprofile(current);
    }
}

void Tab::enterGr(){
    switch(tryGru(grcurr)){
    case 0:
        missingacc();
        return;
    case 1:
        showgroups();
        return;
    case 2:
        current->insertGruppo(grcurr);
        grcurr->insertUser(current);
        //Su database
        QSqlQuery query(*db);
        db->transaction();
        query.prepare("Insert into gruppi(proprietario,nome,id_group,username) values(:prop,:nome,:id,:usn)");
        query.bindValue(":prop", grcurr->getProp());
        query.bindValue(":nome", grcurr->getNome());
        query.bindValue(":id", grcurr->getId());
        query.bindValue(":usn", current->getNick());
        query.exec();
        db->commit();
        QString avviso("L'utente ");
        avviso.append(current->getNome()).append(" ").append(current->getCognome()).append(" e' ora iscritto al gruppo ");
        avviso.append(grcurr->getNome());
        QMessageBox::about(this,"Operazione riuscita",avviso);
        showprofile(current);
    }
}

void Tab::eraseGr(){
    switch(tryGru(grcurr)){
    case 0:
        missingacc();
        return;
    case 1:
        showgroups();
        return;
    case 2:
        QString id= grcurr->getId();
        QString nome= grcurr->getNome();
        gestore->deletegruppo(grcurr);
        grcurr->clearvector();  //necessario senno' liberandomi la memoria del vettore mi cancella gli utenti in esso presenti!
        delete grcurr;
        //Su database
        QSqlQuery query(*db);
        db->transaction();
        query.prepare("Delete from gruppi where id_group=:id");
        query.bindValue(":id", id);
        query.exec();
        db->commit();
        QString avviso("Eliminato gruppo ");
        avviso.append(nome);
        QMessageBox::about(this,"Operazione riuscita",avviso);
        showgroups();
    }
}

void Tab::deleteacc(){
    switch(tryAcc(current)){
    case 0: case 1:
        missingacc();
        return;
    case 2:
        gestore->elimina(current);  //elimino il puntatore di current da dovunque sia presente,prima di deallocare la memoria
        QString nick= current->getNick();
        //Su database
        QSqlQuery query_u(*db);
        db->transaction();
        query_u.prepare("Delete from utenti where username = :username");
        query_u.bindValue(":username", nick);
        query_u.exec();
        db->commit();
        QSqlQuery query_g(*db);
        db->transaction();
        query_g.prepare("Delete from gruppi where (username= :username or proprietario= :nome)");
        query_g.bindValue(":username", nick);
        query_g.bindValue(":nome", nick);
        query_g.exec();
        db->commit();
        QSqlQuery query_i(*db);
        db->transaction();
        query_i.prepare("Delete from info where username= :username");
        query_i.bindValue(":username", nick);
        query_i.exec();
        db->commit();
        QSqlQuery query_c(*db);
        db->transaction();
        query_c.prepare("Delete from contatti where (user1= :username or user2= :nome)");
        query_c.bindValue(":username", nick);
        query_c.bindValue(":nome", nick);
        query_c.exec();
        db->commit();
        QString avviso= "Si informa che la disattivazione dell'account dell'utente\n";
        avviso.append(nick).append(" dal sistema e' avvenuta con successo.");
        QMessageBox::about(this, "Disattivazione Account", avviso);
        delete current; //richiama il distruttore di Account che chiama a catena tutti gli altri!
        AmmUs();
    }
}

void Tab::showuser(){
    QMap<QPushButton*, Account*>::const_iterator i = profac.constBegin();
     while (i != profac.constEnd()) {
         if(i.key()->isDown()){
             cercaProfiloU(i.value());
             return;
         }
         else ++i;
     }
 }

void Tab::showgroup(){
    QMap<QPushButton*, Gruppo*>::const_iterator i = g.constBegin();
     while (i != g.constEnd()){
         if(i.key()->isDown()){
             cercaProfiloG(i.value());
             return;
         }
         else ++i;
     }
}

void Tab::cercaUser_g(){
    hideAll();
    clear_le();
    label1->show();
    QFont font= label1->font();
    font.setPointSize(28);
    label1->setFont(font);
    le1->show();
    //le1->setPlaceholderText("Nome");  //Non funziona in Qt4.6!! Introdotto in Qt 4.7
    le2->show();
    //le2->setPlaceholderText("Cognome");
    le3->show();
    //le3->setPlaceholderText("Username");
    src1->setText("Nome");
    src2->setText("Cognome");
    src3->setText("Username");
    src1->show();
    src2->show();
    src3->show();
    label1->setText("Ricerca Utenti");
    search->show();
    back->show();
    back->setEnabled(true);
    layout->addWidget(src1, 3,0);
    layout->addWidget(src2, 4,0);
    layout->addWidget(src3, 5,0);
    layout->addWidget(le1, 3,1);
    layout->addWidget(le2, 4,1);
    layout->addWidget(le3, 5,1);
    layout->addWidget(search, 6,1,Qt::AlignCenter);

    disconnect(search,0,0,0);
    connect(search, SIGNAL(clicked()), this, SLOT(cercaUser()));
}

void Tab::cercaGruppo_g(){
    cercaUser_g();
    //Non funziona in Qt4.6!! Introdotto in Qt 4.7
    //le1->setPlaceholderText("Id");
    //le2->setPlaceholderText("Nome");
    //le3->setPlaceholderText("Proprietario");
    label1->setText("Ricerca Gruppo");
    src1->setText("Id");
    src2->setText("Nome");
    src3->setText("Proprietario");

    disconnect(search,0,0,0);
    connect(search, SIGNAL(clicked()), this, SLOT(cercaGruppo()));
}

void Tab::cercaUser(){
    if(le1->text().isEmpty()&&le2->text().isEmpty()&&le3->text().isEmpty()){
        alert->setText("Inserire almeno un campo");
        alert->show();
        layout->addWidget(alert, 1,1,Qt::AlignCenter);
    }
    else{   //almeno un campo inserito
        hideAll();
        query();
    }
    QFont font= alert->font();
    font.setPointSize(10);
    alert->setFont(font);
}

void Tab::cercaGruppo(){
    if(le1->text().isEmpty()&&le2->text().isEmpty()&&le3->text().isEmpty()){
        alert->setText("Inserire almeno un campo");
        alert->show();
        layout->addWidget(alert, 1,1, Qt::AlignCenter);
    }
    else{   //almeno un campo inserito
        hideAll();
        queryg();
    }
    QFont font= alert->font();
    font.setPointSize(10);
    alert->setFont(font);
}

void Tab::logout(){
    tabbed->removeTab(tabbed->indexOf(this));
    tabba();
}

void Tab::confirm(){
    hideAll();
    label1->show();
    QFont font= alert->font();
    font.setPointSize(15);
    alert->setFont(font);
    alert->show();
    layout->addWidget(alert, 2,1,Qt::AlignCenter);
    accedi->setText("SI");
    registro->setText("NO");
    registro->setIcon(QIcon(""));
    layout->addWidget(accedi, 3,1,Qt::AlignLeft);
    layout->addWidget(registro, 3,1,Qt::AlignRight);
    accedi->show();
    accedi->setEnabled(true);
    registro->show();
    registro->setEnabled(true);
    back->show();
    back->setEnabled(true);
}
